<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    变量提升

    var 的变量提升 声明在前，赋值在后
    function 的变量提升  声明+赋值都会提前

    <script>
        //  console.log(a);
        //  var a=10;

        //  var a;
        //  console.log(a);
        //  a=10;

        // show();
        // function show(){
        //     console.log("111")
        // }


        // var a=2;
        // var b=a;//2
        // b=3;//3
        // console.log(b);//3

        // console.log(fn(1,2));   // 依然是3
        // function fn(n,m){
        //     return n+m;
        // }
        // console.log(fn(1,2));//3

        //var 做变量提升的时候，不会看 if条件判断，是否成立，直接提升
        // console.log(a);//undefined 
        // if(1==2){
        //    var a=12;
        // }
        // console.log(a);//undefined

        // var a;
        // console.log(a);//undefined 
        // if(1==2){
        //    a=12;
        // }
        // console.log(a);//undefined


        //块级作用域 {}  除了对象，函数 + es6 方式声明变量（class,let,const...)
        // {
        //   let a=10;
        // }

        // console.log(a);// is not defined

        //判断语句中
        //function 的变量提升  声明都会提前，赋值还在原来的位置
        // function：
        //     ● 新版本浏览器中的function 只是声明，不定义
        //     ● 在老版本中还是声明和定义（仅限判断语句）
        
        // console.log(fn);//undefined
        // if(1==2){
        //     function fn(){
        //         console.log(1)
        //     }
        // }
        // console.log(fn);//undefined

        // //第一次，不看判断条件，直接声明提前
        // console.log(fn);//undefined
        // if(1==1){//第二次，条件判断成立，声明提前+赋值
        //     function fn(){
        //         console.log(1)
        //     }
        // }
        // console.log(fn);//函数体

        //第一次，不看判断条件，直接声明提前
        // console.log(fn);//undefined
        // if(1==1){//第二次，条件判断成立，声明提前+赋值
        //     console.log(fn);//函数体
        //     function fn(){console.log(1)}
        //     //以函数体为分界线，上面是上级作用域，下面是私有块级作用域
        //     fn=3;
        //     console.log(fn);//3
        // }
        // console.log(fn);//函数体



        // console.log(fn);//undefined
        // if(1==1){//第二次，条件判断成立，声明提前+赋值
        //     console.log(fn);//函数体
        //     function fn(){console.log(1)}
        //     fn=3;
        //     console.log(fn);//3
        //     function fn(){console.log(1)//以后面这个为分界线
        //     fn=5;
        //     console.log(fn)//5
        // }
        // console.log(fn);//3


        // console.log(fn);//undefined
        // console.log(fna);//undefined
        // if(1==1){//第二次，条件判断成立，声明提前+赋值
        //     console.log(fn);//函数体
        //     function fn(){console.log(1)}
        //     fn=3;
        //     console.log(fn);//3
        //     function fna(){console.log(1)}//以后面这个为分界线
        //     fn=5;
        //     console.log(fn)//5
        // }
        // console.log(fn);//函数体
        // console.log(fna);//函数体

        // console.log(fn);//undefined
        // if(1==1){//第二次，条件判断成立，声明提前+赋值
        //     console.log(fn);//函数体
        //     function fn(){console.log(1)}
        //     fn=3;
        //     console.log(fn);//3
        //     fn=5;
        //     console.log(fn)//5
        // }
        // console.log(fn);//函数体

        
        // console.log(fna);//undefined
        // if(1==1){//第二次，条件判断成立，声明提前+赋值
        //     function fna(){console.log(1)//以后面这个为分界线
        // }
        // console.log(fna);//函数体

    </script>
</body>
</html>